#include "padron.h"


Padron::Padron()
{
    if(!QSqlDatabase::contains("PdnPconex"))
        QSqlDatabase::addDatabase("QSQLITE","PdnPconex");
    if(!QSqlDatabase::contains("PdnLGconex"))
        QSqlDatabase::addDatabase("QSQLITE","PdnLGconex");
    pvid = new PVID_Authority();
}

Padron::~Padron(){}

bool Padron::crea_padron_propuesta(QString Dir){
    if(!QFile::exists("PadronLocal.db")){
        show_msg("No se ha cargado el padron!","Verifique que se haya creado el padron","",QMessageBox::Critical);
        return false;
    }

    if(!QFile::exists(QString(Dir).append("/PVID_List.db"))){
        QString cmd("sqlite3 ");
        cmd.append(Dir).append("/PVID_List.db 'create table list(PVID1 BLOB, PVID2 BLOB,vote_saved BLOB);'");
        system(cmd.toAscii().data());
    }

// Crea la conexion al Padron Propuesta (PdnP)
    QSqlDatabase PdnP = QSqlDatabase::database("PdnPconex",false);
    PdnP.setDatabaseName(QString(Dir).append("/PVID_List.db"));
    if(!PdnP.open()){
            return false;
        }

// Crea el modelo
    QSqlTableModel *PdnPmodel = new QSqlTableModel(0,PdnP);
    PdnPmodel->setTable("list");
    PdnPmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    PdnPmodel->setSort(1,Qt::AscendingOrder);
    PdnPmodel->select();

// Crea la conexion al Padron Local General (PdnLG)
    QSqlDatabase PdnLG = QSqlDatabase::database("PdnLGconex",false);
    PdnLG.setDatabaseName("PadronLocal.db");
    if(!PdnLG.open()){
            return false;
        }

// Crea el modelo
    QSqlTableModel *PdnLGmodel = new QSqlTableModel(0,PdnLG);
    PdnLGmodel->setTable("padron");
    PdnLGmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    PdnLGmodel->setSort(1,Qt::AscendingOrder);
    PdnLGmodel->select();

    for(int i = 0; i < PdnLGmodel->rowCount();i++){
        if(verifica_registro_asambleista(PdnLGmodel->record(i).value("ID"),PdnLGmodel)){
            PdnPmodel->insertRows(0, 1);
            PdnPmodel->setData(PdnPmodel->index(0,PdnPmodel->fieldIndex("PVID1")),
                               pvid->PVID_generation(PdnLGmodel->record(i).value("RFTag").toString(),PdnLGmodel->record(i).value("pin").toString()));
            PdnPmodel->setData(PdnPmodel->index(0,PdnPmodel->fieldIndex("PVID2")),
                               pvid->PVID_generation(PdnLGmodel->record(i).value("pin").toString(),PdnLGmodel->record(i).value("RFTag").toString()));
            PdnPmodel->setData(PdnPmodel->index(0,PdnPmodel->fieldIndex("vote_saved")),"no");
            PdnPmodel->submitAll();

        }
    }

    return true;
}

bool Padron::verifica_registro_asambleista(QVariant ID, QSqlTableModel *model){

    for(int i = 0; i < model->rowCount();i++){
        if(model->record(i).value("ID")==ID){
            if(model->record(i).value("Reg")=="si"){
                return true;
            }
            return false;
        }
    }
    return false;
}

void Padron::borra_padron_general(QTableView *tableView_padron){
    switch(show_msg("Esta accion borra el padron local, lo<br>"
                    "que provoca que se borren los codigos<br>"
                    "de seguridad de los votantes",
                    "Desea borrar el padron de todas formas?","",
                    QMessageBox::Warning,QMessageBox::No | QMessageBox::Yes)) {
        case QMessageBox::No:
          return;
        case QMessageBox::Yes:
              {
              // Crea la conexion
                  QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
                  Pdn.setDatabaseName("PadronLocal.db");
                  if(!Pdn.open()){
                          return;
                      }

              // Crea el modelo
                  QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
                  Pdnmodel->setTable("padron");
                  Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
                  Pdnmodel->setSort(1,Qt::AscendingOrder);
                  Pdnmodel->select();

                  Pdnmodel->removeRows(0,Pdnmodel->rowCount());
                  Pdnmodel->submitAll();

                  tableView_padron->setModel(Pdnmodel);
              }
          break;
    }
}

void Padron::Visualiza_padron_general(QTableView *tableView_padron){

    if(!QFile::exists("PadronLocal.db")){
        QString cmd("sqlite3 PadronLocal.db 'create table padron(ID BLOB, Nombre BLOB, RFTag BLOB, pin BLOB, Reg BLOB);'");
        system(cmd.toAscii().data());
    }

// Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    if(!Pdn.open()){
            return;
        }

// Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    Pdnmodel->setSort(1,Qt::AscendingOrder);
    Pdnmodel->select();

    tableView_padron->setModel(Pdnmodel);
    tableView_padron->hideColumn(Pdnmodel->fieldIndex("Reg"));
    tableView_padron->hideColumn(Pdnmodel->fieldIndex("pin"));
    tableView_padron->setColumnWidth(0,80);
    tableView_padron->setColumnWidth(1,240);
    tableView_padron->setColumnWidth(2,120);
}

bool Padron::ing_manual_padron_general(QTableView *tableView_padron,QLineEdit *ID, QLineEdit *nombre, QLineEdit *RFTag){
    // Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    Pdn.open();

    // Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    Pdnmodel->setFilter(QString("RFTag='").append(RFTag->text()).append("'"));
    Pdnmodel->select();

    if(Pdnmodel->rowCount()!=0 && Pdnmodel->record(0).value("ID").toString()!=ID->text()){
        show_msg(QString("EL RFTag ingresado se encuentra asignado a<i><center><h2>%1</i>").arg(Pdnmodel->record(0).value("Nombre").toString()));
        return false;
    }

    Pdnmodel->setFilter(QString("ID='").append(ID->text()).append("'"));
    Pdnmodel->select();

    if(Pdnmodel->rowCount()==0){
        Pdnmodel->insertRows(0, 1);
        Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("ID")),ID->text());
    }
    else{
        switch(show_msg("El asambleista ya se encuentra en el padron",
                 "Desea actualizar la informacion del asambleista?","",
                 QMessageBox::Question,
                 QMessageBox::No | QMessageBox::Yes)){
            case QMessageBox::No:
                return false;
            case QMessageBox::Yes:
                break;
        }
    }

    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("Nombre")),nombre->text().toUpper());
    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("RFTag")),RFTag->text());
    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("pin")),0);
    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("Reg")),"no");
    Pdnmodel->submitAll();

// Retoma todo el contenido de la base de datos
    Pdnmodel->setFilter("");
    Pdnmodel->setSort(1,Qt::AscendingOrder);
    Pdnmodel->select();

    tableView_padron->setModel(Pdnmodel);

    for(int i = 0; i < Pdnmodel->rowCount();i++){
        if(Pdnmodel->record(i).value("ID").toString()==ID->text()){
            tableView_padron->selectRow(i);
            break;
        }
    }
    return true;
}

void Padron::borra_asambleista(QString data,int column){
    // Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    Pdn.open();

    // Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    switch(column){
    case 0:
        Pdnmodel->setFilter(QString("ID='").append(data).append("'"));
        break;
    case 1:
        Pdnmodel->setFilter(QString("Nombre='").append(data).append("'"));
        break;
    case 2:
        Pdnmodel->setFilter(QString("RFTag='").append(data).append("'"));
        break;
    }

    Pdnmodel->select();

    if(Pdnmodel->rowCount() > 0) {
        Pdnmodel->removeRows(0, Pdnmodel->rowCount());
        Pdnmodel->submitAll();
    }
}

int Padron::show_msg(QString message, QString info, QString detail, QMessageBox::Icon icono, QMessageBox::StandardButtons buttons){
    QMessageBox message1(0);
    message1.setStyleSheet("QAbstractButton{background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(157, 246, 227, 255), stop:1 rgba(168, 168, 168, 255)); border-top-color: rgb(233, 248, 241); border-left-color: rgb(233, 248, 241); border-bottom-color: rgb(81, 120, 107); border-right-color: rgb(81, 120, 107); border-style: outset; border-width: 2px; padding: 3px; border-radius: 15px; min-height:20 px; min-width:80 px; color: black} QAbstractButton:pressed{background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(97, 186, 167, 255), stop:1 rgba(148, 148, 148, 255)); color: rgb(85, 0, 0); border-style: inset; border-top-color: rgb(81, 120, 107); border-left-color: rgb(81, 120, 107); border-bottom-color: rgb(233, 248, 241); border-right-color: rgb(233, 248, 241);} QLabel{color: rgb(255,255,100); background-color: rgba(170, 255, 255, 0)} QDialog{background-color: rgb(132, 150, 255);}");
    message1.setWindowModality(Qt::ApplicationModal);
    message1.setText(message.prepend("<b>").append("</b>"));
    message1.setInformativeText(info);
    message1.setDetailedText(detail);
    message1.setIcon(icono);
    message1.setStandardButtons(buttons);
    return message1.exec();
}

bool Padron::entrada_asambleista(QString data, int index,QString &pin){
    // Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    Pdn.open();

    // Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    Pdnmodel->select();

    switch(index){
    case 0:
        Pdnmodel->setFilter(QString("ID='").append(data).append("'"));
        break;
    case 1:
        Pdnmodel->setFilter(QString("Nombre='").append(data).append("'"));
        break;
    case 2:
        Pdnmodel->setFilter(QString("RFTag='").append(data).append("'"));
        break;
    }
    Pdnmodel->select();

    if(Pdnmodel->rowCount()==0)
        return false;

    if(Pdnmodel->record(0).value("Reg").toString()=="no"){
        Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("pin")),Random.GenerateWord32(1000,9999));
        Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("Reg")),"si");
        Pdnmodel->submitAll();
    }
    pin=Pdnmodel->record(0).value("pin").toString();
    return true;

}

int Padron::salida_asambleista(QString data, int index){
//  Codigo de salida
//  1: se ha registrado la salida del asambleista
//  -1: el asambleista no estaba registrado
//  -2: el ID no pertenece a ningun asambleista

    // Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    Pdn.open();

    // Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    switch(index){
    case 0:
        Pdnmodel->setFilter(QString("ID='").append(data).append("'"));
        break;
    case 1:
        Pdnmodel->setFilter(QString("Nombre='").append(data).append("'"));
        break;
    case 2:
        Pdnmodel->setFilter(QString("RFTag='").append(data).append("'"));
        break;
    }
    Pdnmodel->select();

    if(Pdnmodel->rowCount()==0)
        return -2;
    else if(Pdnmodel->record(0).value("Reg")=="no")
        return -1;


    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("pin")),0);
    Pdnmodel->setData(Pdnmodel->index(0, Pdnmodel->fieldIndex("Reg")),"no");
    Pdnmodel->submitAll();
    return 1;
}

void Padron::reiniciar_sesion(){
    // Crea la conexion
    QSqlDatabase Pdn = QSqlDatabase::database("PdnLGconex",false);
    Pdn.setDatabaseName("PadronLocal.db");
    Pdn.open();

    // Crea el modelo
    QSqlTableModel *Pdnmodel = new QSqlTableModel(0,Pdn);
    Pdnmodel->setTable("padron");
    Pdnmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    Pdnmodel->select();

    for(int i = 0; i<Pdnmodel->rowCount();i++){
        Pdnmodel->setData(Pdnmodel->index(i, Pdnmodel->fieldIndex("pin")),0);
        Pdnmodel->setData(Pdnmodel->index(i, Pdnmodel->fieldIndex("Reg")),"no");
    }
    Pdnmodel->submitAll();
}
